package kingdoms.rede;

import br.ufsc.inf.leobr.cliente.Jogada;
import br.ufsc.inf.leobr.cliente.OuvidorProxy;
import br.ufsc.inf.leobr.cliente.Proxy;
import br.ufsc.inf.leobr.cliente.exception.ArquivoMultiplayerException;
import br.ufsc.inf.leobr.cliente.exception.JahConectadoException;
import br.ufsc.inf.leobr.cliente.exception.NaoConectadoException;
import br.ufsc.inf.leobr.cliente.exception.NaoJogandoException;
import br.ufsc.inf.leobr.cliente.exception.NaoPossivelConectarException;
import java.util.logging.Level;
import java.util.logging.Logger;
import kingdoms.Tabuleiro;

public class AtorNetGames implements OuvidorProxy {

    private static final long serialVersionUID = 1L;
    protected Tabuleiro atorJogador;
    protected Proxy proxy;

    public AtorNetGames(Tabuleiro jogoFrame) {
        super();
        this.atorJogador = jogoFrame;
        this.proxy = Proxy.getInstance();
        proxy.addOuvinte(this);
    }

    public boolean conectar(String servidor, String nome) {
        try {
            proxy.conectar(servidor, nome);
            return true;
        } catch (JahConectadoException e) {
            atorJogador.exibirMensagem("jah conectado");
            Logger.getLogger(AtorNetGames.class.getName()).log(Level.SEVERE, null, e);
            return false;
        } catch (NaoPossivelConectarException e) {
            atorJogador.exibirMensagem("nao eh possivel conectar");
            Logger.getLogger(AtorNetGames.class.getName()).log(Level.SEVERE, null, e);
            return false;
        } catch (ArquivoMultiplayerException e) {
            atorJogador.exibirMensagem("excecao no arquivo multiplayer");
            Logger.getLogger(AtorNetGames.class.getName()).log(Level.SEVERE, null, e);
            return false;
        }
    }

    public boolean desconectar() {
        try {
            proxy.desconectar();
            return true;
        } catch (NaoConectadoException e) {
            atorJogador.exibirMensagem(e.getMessage());
            Logger.getLogger(AtorNetGames.class.getName()).log(Level.SEVERE, null, e);
            return false;
        }
    }

    public void iniciarPartida() {
        try {
            proxy.iniciarPartida(new Integer(2));
        } catch (NaoConectadoException e) {
            atorJogador.exibirMensagem(e.getMessage());
            Logger.getLogger(AtorNetGames.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    public void enviarJogada(Mensagem mensagem) {
        try {
            proxy.enviaJogada(mensagem);
        } catch (NaoJogandoException e) {
            atorJogador.exibirMensagem(e.getMessage());
            Logger.getLogger(AtorNetGames.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    public String informarNomeAdversario(String idUsuario) {
        String aux1 = proxy.obterNomeAdversario(new Integer(1));
        String aux2 = proxy.obterNomeAdversario(new Integer(2));
        if (aux1.equals(idUsuario)) {
            return aux2;
        } else {
            return aux1;
        }
    }

    @Override
    public void receberJogada(Jogada jogada) {
        atorJogador.receberJogada((Mensagem) jogada);
    }

    @Override
    public void finalizarPartidaComErro(String message) {
        this.atorJogador.fechar();
    }

    @Override
    public void receberMensagem(String msg) {
        // TODO Auto-generated method stub
        atorJogador.exibirMensagem(msg);
    }

    @Override
    public void tratarConexaoPerdida() {
        this.atorJogador.conexaoPerdida();

    }

    @Override
    public void tratarPartidaNaoIniciada(String message) {
        // TODO Auto-generated method stub
    }

    @Override
    public void iniciarNovaPartida(Integer posicao) {
        this.atorJogador.tratarIniciarPartida(posicao);
    }
}